package com.center.growcenterserver.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.center.growcenterserver.common.R;
import com.center.growcenterserver.mapper.CourseMapper;
import com.center.growcenterserver.mapper.StudentCourseMapper;
import com.center.growcenterserver.model.domain.Course;
import com.center.growcenterserver.model.domain.StudentCourse;
import com.center.growcenterserver.service.CourseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@Slf4j
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {

    @Autowired
    private CourseMapper courseMapper;

    @Autowired
    private StudentCourseMapper studentCourseMapper;

    /**
     * 提交课程评分
     */
    @Override
    public R submitRating(String courseId, String studentId, Double rating) {
        try {
            // 查找课程
            Course course = courseMapper.selectById(courseId);

            if (course == null) {
                return R.error("课程不存在");
            }
            // 更新评分逻辑
            updateCourseRating(course, rating);

            // 保存更新后的课程信息
            boolean success = courseMapper.updateById(course) > 0;

            // 这里以更新所有与该课程相关的 StudentCourse 记录为例
//            List<StudentCourse> studentCourses = studentCourseMapper.selectByCourseId(courseId);
//            for (StudentCourse studentCourse : studentCourses) {
//                // 更新每个 StudentCourse 的评分
//                studentCourse.setRating(rating); // 或者根据实际业务逻辑计算新的评分
//                studentCourseMapper.updateById(studentCourse);
//            }

            // 查找并更新特定学生的课程评分
            StudentCourse studentCourse = studentCourseMapper.selectByCourseIdAndStudentId(courseId, studentId);
            if (studentCourse != null) {
                studentCourse.setRating(rating); // 或者根据实际业务逻辑计算新的评分
                int updateSuccess = studentCourseMapper.updateByCourseIdAndStudentId(courseId, studentId, rating);
                if (updateSuccess <= 0) {
                    return R.error("更新学生课程评分失败");
                }
            } else {
                return R.error("未找到学生课程记录");
            }

            if (success) {
                return R.success("评分成功");
            } else {
                return R.error("评分失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("提交评分时发生错误：" + e.getMessage());
        }
    }

    @Override
    public R selectCourseInfo() {
        // 查询教师总数
        Long courseTotalCount = courseMapper.selectCount(null); // null 参数表示没有额外的查询条件

        // 查询最大评分及其对应的课程名称
        Map<String, Object> maxRatingResult = courseMapper.selectMaxRatingAndName();

        // 查询最小选课人数及其对应的课程名称
        Map<String, Object> minCountResult = courseMapper.selectMinCountAndName();

        Map<String, Object> result = new HashMap<>();

        // 将结果放入Map中
        result.put("courseTotalCount", courseTotalCount);
        // 将结果放入Map中
        result.put("maxRatingName", maxRatingResult.get("name"));
        result.put("maxRatingValue", maxRatingResult.get("rating"));
        result.put("minCountName", minCountResult.get("name"));
        result.put("minCountValue", minCountResult.get("count"));

        // 返回成功响应及数据
        return R.success("查询成功", result);
    }

    private void updateCourseRating(Course course, Double rating) {
        // 使用 Optional 提供默认值，避免 NullPointerException
        Integer ratingCount = Optional.ofNullable(course.getCount()).orElse(0);
        Double currentRating = Optional.ofNullable(course.getRating()).orElse(0.0);

        // 更新评分次数
        int newCount = ratingCount + 1;

        // 计算新的平均评分
//        double newRating = (currentRating * ratingCount + rating) / newCount;

        // 计算新的平均评分
        double newRating;
        if (newCount == 1) {
            // 如果这是第一次评分，则直接设置新评分为当前评分
            newRating = rating;
        } else {
//            currentRating * ratingCount: 计算历史总评分（平均分 × 总次数）。
//            加上新评分 rating 后，得到新的总评分。
//            最后除以新的总评分次数 newCount，得到新的平均评分。
            newRating = (currentRating * ratingCount + rating) / newCount;
        }

        // 更新课程对象
        course.setRating(newRating);
        course.setCount(newCount);

        log.info("Updated course [{}] with new rating: {}, count: {}", course.getCourseId(), newRating, newCount);
    }
}